# -*- coding: UTF-8 -*-
# cython: language_level=3
import re
import time
from datetime import datetime

from fake_useragent import UserAgent

fake_ua = UserAgent(browsers=["chrome", "edge"], os=["windows"])


def get_current_date(date_format='%Y-%m-%d %H:%M:%S'):
    return time.strftime(date_format)


def replace_str(source_str, regex, replace_str='', count=0):
    # '''
    # @summary: 替换字符串
    # ---------
    # @param source_str: 原字符串
    # @param regex: 正则
    # @param replace_str: 用什么来替换 默认为''
    # ---------
    # @result: 返回替换后的字符串
    # '''
    str_info = re.compile(regex)
    return str_info.sub(replace_str, source_str, count)


def del_html_tag(content, except_line_break=False):
    content = replace_str(content, '<script(.|\n)*?</script>')
    content = replace_str(content, '<style(.|\n)*?</style>')
    content = replace_str(content, '<!--(.|\n)*?-->')
    content = replace_str(content, '&.*?;')
    if except_line_break:
        content = content.replace('</p>', '/p')
        content = replace_str(content, '<[^p].*?>')
        content = content.replace('/p', '</p>')
        content = replace_str(content, '[ \f\r\t\v]')

    else:
        content = replace_str(content, '<(.|\n)*?>')
        content = replace_str(content, '\s')
    return content


_regexs = {}


def get_info(html, regexs, allow_repeat=False, fetch_one=False, split=None):
    regexs = isinstance(regexs, str) and [regexs] or regexs

    infos = []
    for regex in regexs:
        if regex == '':
            continue

        if regex not in _regexs.keys():
            _regexs[regex] = re.compile(regex, re.S)

        if fetch_one:
            infos = _regexs[regex].search(html)
            if infos:
                infos = infos.groups()
            else:
                continue
        else:
            infos = _regexs[regex].findall(str(html))

        if len(infos) > 0:
            break

    if fetch_one:
        infos = infos if infos else ('',)
        return infos if len(infos) > 1 else infos[0]
    else:
        infos = allow_repeat and infos or sorted(set(infos), key=infos.index)
        infos = split.join(infos) if split else infos
        return infos


def format_date(date, old_format='', new_format='%Y-%m-%d %H:%M:%S'):
    """
    @summary: 格式化日期格式
    ---------
    @param date: 日期 eg：2017年4月17日 3时27分12秒
    @param old_format: 原来的日期格式 如 '%Y年%m月%d日 %H时%M分%S秒'
        %y 两位数的年份表示（00-99）
        %Y 四位数的年份表示（000-9999）
        %m 月份（01-12）
        %d 月内中的一天（0-31）
        %H 24小时制小时数（0-23）
        %I 12小时制小时数（01-12）
        %M 分钟数（00-59）
        %S 秒（00-59）
    @param new_format: 输出的日期格式
    ---------
    @result: 格式化后的日期，类型为字符串 如2017-4-17 3:27:12
    """
    if not old_format:
        numbers = get_info(date, r'(\d+)', allow_repeat=True)
        formats = ['%Y', '%m', '%d', '%H', '%M', '%S']
        old_format = date
        for i, number in enumerate(numbers):
            if i == 0 and len(number) == 2:  # 年份可能是两位 用小%y
                old_format = old_format.replace(number, formats[i].lower(),
                                                1)  # 替换一次 '2017年11月30日 11:49' 防止替换11月时，替换11小时
            else:
                old_format = old_format.replace(number, formats[i], 1)  # 替换一次

    try:
        date_obj = datetime.strptime(date, old_format)
        date_str = datetime.strftime(date_obj, new_format)
    except Exception as e:
        # log.error('日期格式化出错，old_format = %s 不符合 %s 格式' % (old_format, date))
        date_str = ''
    return date_str


def is_keyword_in_text(text: str, keyword_list: list, to_lower=True):
    if to_lower:
        text = text.lower()
    for i in keyword_list:
        if to_lower:
            i = i.lower()
        if i in text:
            print(f"{i}--->{text}")
            return True


def is_file_url(url, ext=None):
    if ext is None:
        ext = ['jpg', 'jpeg', 'png']
    url = url.partition('?')[0].lower()
    for i in ext:
        if url.endswith('.' + i):
            return True


def raise_error_site_name(title: str):
    title = str(title).strip().lower()
    if not title:
        return
    # assert title
    for error_keyword in [
        'error',
        'Forbidden',
        'not found',
        'bad gateway',
        'iis windows server',
        'welcome to nginx',
        'welcome to tengine',

        '出错',
        '详细错误',
        '找不到',
        '无法访问',
        '无法找到',
        '没有找到',

        '验证码',
        '安全验证',

        '域名到期',
        '域名已过期',
        '域名不存在',
        '域名续费提醒',

        '详细错误',
        '当前无法使用此页面',
    ]:
        assert error_keyword not in title, Exception('Bad Gateway')

    assert title not in ['400', '403', '404', '405', '500', '502', '503'], Exception('Bad Gateway')


def get_host(url):
    home_page = url.split('/')
    # print(home_page)
    assert 'http' in home_page[0], Exception('Incorrect Linking')
    host = home_page[2].partition('?')[0]
    home_page = home_page[0] + '//' + host
    host_spl = host.split('.')
    # print(host_spl)

    if len(host_spl) == 4:  # ipv4
        try:
            [int(i) for i in host_spl[:3]]
            int(host_spl[-1].replace(':', ''))
        except:
            # print('not ipv4')
            pass
        else:
            return {'host': host, 'home_page': home_page}

    if len(host_spl) > 2:
        for s in ['bj.cn', 'tj.cn', 'sh.cn', 'cq.cn', 'he.cn', 'sn.cn', 'sx.cn', 'nm.cn', 'ln.cn', 'jl.cn', 'hl.cn',
                  'js.cn', 'zj.cn', 'ah.cn', 'fj.cn', 'jx.cn', 'sd.cn', 'ha.cn', 'hb.cn', 'hn.cn', 'gd.cn', 'gx.cn',
                  'hi.cn', 'sc.cn', 'gz.cn', 'yn.cn', 'gs.cn', 'qh.cn', 'nx.cn', 'xj.cn', 'tw.cn', 'hk.cn', 'mo.cn',
                  'xz.cn',
                  'com.cn', 'net.cn', 'org.cn', 'gov.cn', 'edu.cn', 'ac.cn', 'mil.cn'
                  ]:
            if host.endswith('.' + s):
                host = host_spl[-3] + '.' + s
                return {'host': host, 'home_page': home_page}
        host = host_spl[-2] + '.' + host_spl[-1]
    return {'host': host, 'home_page': home_page}


if __name__ == '__main__':
    # print(get_icp('weibo.com'))
    print(get_host('https://1.1.1.1:80/aa'))

    print(get_host('http://news.cctv.com.cn?sdsd'))
